home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / -WHDLoad- / WHDLoad_dev / Src / imager-examples / interphase.imager.asm < prev   
Assembly Source File  |  2000-05-08  |  8KB  |  375 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    interphase.imager.asm
  3. ;  :Contents.    Imager for Interphase
  4. ;  :Author.    Wepl
  5. ;  :Version.    $Id: interphase.imager.asm 1.3 1998/06/27 23:48:35 jah Exp jah $
  6. ;  :History.    06.02.98 started
  7. ;        23.04.98 adapted for Patcher 1.05
  8. ;  :Requires.    -
  9. ;  :Copyright.    Public Domain
  10. ;  :Language.    68000 Assembler
  11. ;  :Translator.    Barfly V1.131
  12. ;  :To Do.
  13. ;---------------------------------------------------------------------------*
  14. ;
  15. ;    Disk format:
  16. ;    Disk 1:        0    standard
  17. ;            1    unformatted
  18. ;            2-75    $1400 bytes sync=4489
  19. ;
  20. ;    Image format:
  21. ;    Disk 1        tracks 2-75 = 373760
  22. ;
  23. ;---------------------------------------------------------------------------*
  24.  
  25.     INCDIR    Includes:
  26.     INCLUDE    devices/trackdisk.i
  27.     INCLUDE    intuition/intuition.i
  28.     INCLUDE    utility/tagitem.i
  29.     INCLUDE    lvo/exec.i
  30.     INCLUDE    lvo/intuition.i
  31.     INCLUDE    patcher.i
  32.  
  33.     IFD BARFLY
  34.     OUTPUT    "C:Parameter/interphase.imager"
  35.     BOPT    O+ OG+            ;enable optimizing
  36.     BOPT    ODd- ODe-        ;disable mul optimizing
  37.     ENDC
  38.  
  39. ;======================================================================
  40.  
  41.         moveq    #-1,d0
  42.         rts
  43.         dc.l    _Table
  44.         dc.l    "PTCH"
  45.  
  46. ;======================================================================
  47.  
  48. _Table        dc.l    PCH_ADAPTOR,.adname        ;name adaptor
  49.         dc.l    PCH_NAME,.name            ;description of parameter
  50.         dc.l    PCH_FILECOUNT,1            ;number of cycles
  51.         dc.l    PCH_FILENAME,.filenamearray    ;file names
  52.         dc.l    PCH_DATALENGTH,_lengtharray    ;file lengths
  53.         dc.l    PCH_DISKNAME,.disknamearray    ;disk names
  54.         dc.l    PCH_SPECIAL,.specialarray    ;functions
  55.         dc.l    PCH_STATE,.statearray        ;state texts
  56.         dc.l    PCH_MINVERSION,.patcherver    ;minimum patcher version required
  57.         dc.l    PCH_INIT,_Init            ;init routine
  58.         dc.l    PCH_FINISH,_Finish        ;finish routine
  59.         dc.l    PCH_ERRORINPARAMETER,_Finish    ;finish routine
  60.         dc.l    TAG_DONE
  61.  
  62. .filenamearray    dc.l    .f1
  63. .disknamearray    dc.l    .d
  64. .specialarray    dc.l    _Special
  65. .statearray    dc.l    .insertdisk
  66.  
  67. .f1        dc.b    "Disk.1",0
  68. .d        dc.b    "Interphase",0
  69.  
  70. .adname        dc.b    "Done by Wepl.",0
  71. .name        dc.b    "Interphase, Diskimager for HD-Install",0
  72. .patcherver    dc.b    "V1.05"
  73. .insertdisk    dc.b    'Please insert your original writepro-',10
  74.         dc.b    'tected disk in the source drive.',0
  75.     IFD BARFLY
  76.         dc.b    "$VER: "
  77.     DOSCMD    "WDate >T:date"
  78.     INCBIN    "T:date"
  79.         dc.b    0
  80.     ENDC
  81.     EVEN
  82.  
  83. ;======================================================================
  84.  
  85. _Init        moveq    #0,d0                ;source drive
  86.         move.l    PTB_INHIBITDRIVE(a5),a0        ;inhibit drive
  87.         jsr    (a0)
  88.         tst.l    d0
  89.         bne    .error
  90.         
  91.         moveq    #0,d0                ;source drive
  92.         move.l    PTB_OPENDEVICE(a5),a0        ;open source device
  93.         jsr    (a0)
  94.         tst.l    d0
  95.         bne    .error
  96.         rts
  97.  
  98. .error        bsr    _Finish
  99.         moveq    #-1,d0
  100.         rts
  101.  
  102. ;======================================================================
  103.  
  104. _Finish        moveq    #0,d0                ;source drive
  105.         move.l    PTB_ENABLEDRIVE(a5),a0        ;deinhibit drive
  106.         jmp    (a0)
  107.  
  108. ;======================================================================
  109.  
  110. RAWREADLEN    = $7c00
  111. BYTESPERTRACK    = $1400
  112. SYNC        = $4489
  113.  
  114. ;======================================================================
  115.  
  116. TRACKS_1    = 73
  117.  
  118. _lengtharray    dc.l    BYTESPERTRACK*TRACKS_1
  119. _starttrack    dc.b    2
  120. _counttrack    dc.b    TRACKS_1
  121.  
  122. ;======================================================================
  123.  
  124. _Special    moveq    #-1,d7                ;D7 = return code (default=error)
  125.  
  126.         bsr    _InsertDisk
  127.         tst.l    d0
  128.         beq    .nodisk
  129.         
  130.     ;check for disk in drive
  131.         move.l    (PTB_DEVICESOURCEPTR,a5),a1
  132.         move.w    #TD_CHANGESTATE,(IO_COMMAND,a1)
  133.         move.l    (4).w,a6
  134.         jsr    (_LVODoIO,a6)
  135.         tst.l    (IO_ACTUAL,a1)
  136.         bne    .nodisk
  137.  
  138.         moveq    #0,d2                ;D2 = start/actual track
  139.         move.b    (_starttrack,pc,d6.w),d2
  140.         moveq    #0,d3                ;D3 = amount of tracks
  141.         move.b    (_counttrack,pc,d6.w),d3
  142.         move.l    (PTB_ADDRESSOFFILE,a5),a2    ;A2 = file address
  143.  
  144. .next        move.l    d2,d0
  145.         move.l    d3,d1
  146.         bsr    _Display
  147.         moveq    #5-1,d6                ;D6 = retries decoding
  148. .decretry    moveq    #5-1,d5                ;D5 = retries rawread
  149. .tdretry    move.l    (PTB_DEVICESOURCEPTR,a5),a1
  150.         move.l    (PTB_SPACE,a5),(IO_DATA,a1)    ;track is to load in ptb_space
  151.         move.l    #RAWREADLEN,(IO_LENGTH,a1)    ;double length of track to decode the index-sync-read data
  152.         move.l    d2,(IO_OFFSET,a1)
  153.         move.w    #TD_RAWREAD,(IO_COMMAND,a1)
  154.         move.b    #IOTDB_INDEXSYNC,(IO_FLAGS,a1)
  155.         move.l    (4).w,a6
  156.         jsr    (_LVODoIO,a6)
  157.         tst.l    d0
  158.         beq    .tdok
  159.         dbf    d5,.tdretry
  160.         bra    .tderr
  161. .tdok
  162.         move.l    (PTB_SPACE,a5),a0        ;source
  163.         move.l    a2,a1                ;destination
  164.         bsr    _Decode
  165.         tst.l    d0
  166.         beq    .decok
  167.         dbf    d6,.decretry
  168.         bra    .decerr
  169. .decok
  170.         add.l    #BYTESPERTRACK,a2
  171.         addq.w    #1,d2                ;one track further
  172.         subq.w    #1,d3                ;one track less
  173.         bne    .next
  174.  
  175.         moveq    #0,d7                ;return code
  176.         bra    .motoff
  177. .decerr
  178. .tderr        bsr    _ReadError
  179.  
  180.     ;switch motor off
  181. .motoff        move.l    (PTB_DEVICESOURCEPTR,a5),a1
  182.         clr.l    (IO_LENGTH,a1)
  183.         move.w    #TD_MOTOR,(IO_COMMAND,a1)
  184.         move.l    (4).w,a6
  185.         jsr    (_LVODoIO,a6)
  186. .nodisk
  187.     ;enable drive
  188.         tst.b    d7
  189.         beq    .quit
  190.         bsr    _Finish
  191.         
  192. .quit        move.l    d7,d0
  193.         rts
  194.  
  195. ;======================================================================
  196. ; IN:    A0 = raw
  197. ;    A1 = dest
  198. ; OUT:    D0 = error
  199.  
  200. GetW    MACRO
  201.         cmp.l    a0,a5
  202.         bls    .error
  203.         move.l    (a0),\1
  204.         lsr.l    d5,\1
  205.     ENDM
  206. GetW2    MACRO
  207.         cmp.l    a2,a5
  208.         bls    .error
  209.         move.l    (a2),\1
  210.         lsr.l    d5,\1
  211.     ENDM
  212. GetWI    MACRO
  213.         GetW    \1
  214.         addq.l    #2,a0
  215.     ENDM
  216. GetWI2    MACRO
  217.         GetW2    \1
  218.         addq.l    #2,a2
  219.     ENDM
  220. GetLI    MACRO
  221.         GetWI    \1
  222.         swap    \1
  223.         GetWI    \2
  224.         move.w    \2,\1
  225.     ENDM
  226. GetLI2    MACRO
  227.         GetWI2    \1
  228.         swap    \1
  229.         GetWI2    \2
  230.         move.w    \2,\1
  231.     ENDM
  232.  
  233. _Decode        movem.l    d1-a6,-(a7)
  234.         move.l    a7,a6            ;A6 = return stack
  235.         lea    (RAWREADLEN,a0),a5    ;A5 = end of raw data
  236.  
  237.     ;find sync
  238. .sync1        moveq    #16-1,d5        ;D5 = shift count
  239. .sync2        GetW    d0
  240.         cmp.w    #SYNC,d0
  241.         beq    .sync3
  242. .sync_retry    dbf    d5,.sync2
  243.         addq.l    #2,a0
  244.         bra    .sync1
  245.  
  246. .sync3        movem.l    a0/a1,-(a7)        ;save this point for new try
  247.  
  248. .sync4        addq.l    #2,a0
  249.         GetW    d0
  250.         cmp.w    #SYNC,d0
  251.         beq    .sync4
  252.         
  253.     ;now stuff from original
  254.         MOVE.L    #$55555555,D4        ;D4 = mask
  255.  
  256.         GetLI    d0,d7
  257.         GetLI    d1,d7            ;track number
  258.         and.l    d4,d0
  259.         and.l    d4,d1
  260.         add.l    d0,d0
  261.         or.l    d1,d0
  262.         cmp.b    d0,d2            ;D2 = track
  263.         bne    .fail
  264.  
  265.         GetLI    d0,d7
  266.         GetLI    d1,d7            ;track number
  267.         and.l    d4,d0
  268.         and.l    d4,d1
  269.         add.l    d0,d0
  270.         or.l    d1,d0
  271.         move.l    d0,a3            ;A3 = checksum
  272.  
  273.                         ;A0 = pointer 1
  274.         lea    (BYTESPERTRACK,a0),a2    ;A2 = pointer 2
  275.         MOVE.W    #BYTESPERTRACK/4-1,D3    ;D3 = loop count
  276.         moveq    #0,d6            ;D6 = sum
  277. .lp        GetLI    d0,d7
  278.         GetLI2    d1,d7
  279.         and.l    d4,d0
  280.         and.l    d4,d1
  281.         eor.l    d0,d6
  282.         eor.l    d1,d6
  283.         add.l    d0,d0
  284.         or.l    d1,d0
  285.         move.l    d0,(a1)+
  286.         dbf    d3,.lp
  287.         
  288.         cmp.l    d6,a3
  289.         beq    .success
  290.  
  291. .fail        movem.l    (a7)+,a0/a1
  292.         bra    .sync_retry        ;try again
  293.  
  294. .success    moveq    #0,d0
  295. .quit        move.l    a6,a7
  296.         movem.l    (a7)+,d1-a6
  297.         rts
  298. .error        moveq    #-1,d0
  299.         bra    .quit
  300.  
  301. ;======================================================================
  302.  
  303. _InsertDisk    sub.l    a0,a0                ;window
  304.         pea    (.gadgets)
  305.         pea    (.text)
  306.         pea    (.titel)
  307.         clr.l    -(a7)
  308.         pea    (EasyStruct_SIZEOF)
  309.         move.l    a7,a1                ;easyStruct
  310.         sub.l    a2,a2                ;IDCMP_ptr
  311.         move.l    d6,-(a7)
  312.         addq.l    #1,(a7)
  313.         move.l    a7,a3                ;Args
  314.         move.l    (PTB_INTUITIONBASE,a5),a6
  315.         jsr    (_LVOEasyRequestArgs,a6)
  316.         add.w    #6*4,a7
  317.         rts
  318.  
  319. .titel        dc.b    "Insert Disk",0
  320. .text        dc.b    "Insert your orginal disk %ld",10
  321.         dc.b    "into the source drive !",0
  322. .gadgets    dc.b    "OK|Cancel",0,0
  323.  
  324. ;======================================================================
  325.  
  326. _ReadError    sub.l    a0,a0                ;window
  327.         pea    (.gadgets)
  328.         pea    (.text)
  329.         pea    (.titel)
  330.         clr.l    -(a7)
  331.         pea    (EasyStruct_SIZEOF)
  332.         move.l    a7,a1                ;easyStruct
  333.         sub.l    a2,a2                ;IDCMP_ptr
  334.         move.l    d2,-(a7)
  335.         move.l    a7,a3                ;Args
  336.         move.l    (PTB_INTUITIONBASE,a5),a6
  337.         jsr    (_LVOEasyRequestArgs,a6)
  338.         add.w    #6*4,a7
  339.         rts
  340.  
  341. .titel        dc.b    "Error",0
  342. .text        dc.b    "Can't read track %ld",0
  343. .gadgets    dc.b    "OK",0
  344.  
  345. ;======================================================================
  346. ; IN:    D0 = actual tracknumber
  347. ;    D1 = tracks left to do
  348.  
  349. _Display    movem.l    d0-d1/a0-a3/a6,-(a7)
  350.         lea    (.text),a0        ;format string
  351.         move.l    d1,-(a7)
  352.         move.l    d0,-(a7)
  353.         move.l    a7,a1            ;arg array
  354.         lea    (.PutChar),a2
  355.         sub.l    #100-8,a7
  356.         move.l    a7,a3            ;buffer
  357.         move.l    (4),a6
  358.         jsr    (_LVORawDoFmt,a6)
  359.         move.l    a7,a0
  360.         move.l    (PTB_DISPLAY,a5),a6
  361.         jsr    (a6)
  362.         add.l    #100,a7
  363.         movem.l    (a7)+,d0-d1/a0-a3/a6
  364.         rts
  365.  
  366. .PutChar    move.b    d0,(a3)+
  367.         rts
  368.  
  369. .text        dc.b    "reading track %ld, left %ld",0
  370.  
  371. ;======================================================================
  372.  
  373.     END
  374.  
  375.